package com.thiswhyme.stream.rabbit.publish;

import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.util.CollectionUtils;

import java.util.Map;

/**
 * @description: 消息投递声明接口
 * @author: thiswhyme
 * @date: 2021/1/15
 */
public interface IPublisher {

    /**
     * 投递消息（默认方法）
     * @param channel 消息通道
     * @param headers 自定义消息头
     * @param msg 消息内容
     */
    default void defaultSend(MessageChannel channel, Map<String, Object> headers, Object msg) {
        MessageBuilder builder = MessageBuilder.withPayload(msg);
        if(!CollectionUtils.isEmpty(headers)) {
            headers.forEach((k, v) -> {
                builder.setHeader(k, v);
            });
        }
        channel.send(builder.build());
    }

    /**
     * 获取投递通道
     * @return
     */
    MessageChannel getOutputChannel();

    /**
     * 自定义ACK处理
     * 消息投递到exchange会触发该方法，配合“@ServiceActivator”注解使用
     * @param message 消息
     */
    void confirmSuccess(Message<?> message);

    /**
     * 自定义ACK处理
     * 消息未路由到queue会触发该方法，配合“@ServiceActivator”注解使用
     * @param message 退回的消息
     */
    void confirmFail(Message<?> message);
}
